package TP2.modelo;
import ar.uba.fi.algo3.titiritero.ObjetoVivo;
import ar.uba.fi.algo3.titiritero.Posicionable;

import java.awt.Point;
import java.io.Serializable;

public abstract class Movil implements Posicionable,ObjetoVivo,Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -3744381683149227551L;
	private Point posicion;
	protected int radioDeColision;
	protected LimitesDelEscenario limitesDeMovimiento;
	boolean estaDestruido;
	protected int velocidad;
	private boolean ignorarLimites;
		
	public Movil() {
		//CONSTRUCTOR DE LA CLASE MOVIL
		estaDestruido = false;
		Escenario escenario = Escenario.getInstancia();
		limitesDeMovimiento = escenario.getLimites();
		posicion = new Point();
	}
	//Identifica si se quiere identificar si se ha salido de la pantalla o no
	public void setIgnorarLimites(boolean ignorar){
		ignorarLimites = ignorar;
	}
	public void colisionarConAvion(Avion unAvion) {
		//Por defecto todos los aviones al chocar contra otro, se destruyen.
		if(this.informarColisionCon(unAvion)) {
			this.destruir();
		}

	}
	public void destruir() {
		estaDestruido = true;
	}
	
	
	public Point getPosicion() {
		return posicion;
	}
	
	public int getRadioDeColision() {
		return radioDeColision;
	}
	
	public boolean informarColisionCon(Movil unMovil){
		//Devuelve true si hay colision entre self y unMovil
		int distanciaActual;
		int distanciaMinima;
		
		distanciaActual = (int) (this.getPosicion()).distance(unMovil.getPosicion());
		distanciaMinima = (this.getRadioDeColision() + unMovil.getRadioDeColision());
		return (distanciaActual <= distanciaMinima);
	}
	
	public boolean estaDestruido(){
		return estaDestruido;
	}
	
	public void setPosicion(Point unPunto){
		//Definicion de la posicion del movil
		Point limiteMinimo;
		Point limiteMaximo;
		limiteMinimo = limitesDeMovimiento.getLimiteMinimo();
		limiteMaximo = limitesDeMovimiento.getLimiteMaximo();
		
		if(!ignorarLimites){
			if(((unPunto.x < limiteMinimo.x) && (unPunto.y < limiteMinimo.y)) ||
				((unPunto.x > limiteMaximo.x)&& (unPunto.y > limiteMaximo.y))){
					throw new Error("El punto debe estar dentro de los limites del escenario");
			}
		}
		posicion.setLocation(unPunto);
	}
	@Override
	public int getX() {
		// TODO Auto-generated method stub
		return (int) posicion.getX();
	}
	@Override
	public int getY() {
		// TODO Auto-generated method stub
		return (int) posicion.getY();
	}
}
